import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as fs from 'fs';
import { join } from 'path';
import { Logger } from '@nestjs/common';
import { AllExceptionsFilter } from './common/filters/all-exceptions.filter';
import { LoggingInterceptor } from './common/interceptors/logging.interceptor';
import * as dotenv from 'dotenv';

// 加载环境变量
dotenv.config();

async function bootstrap() {
  // 创建详细的日志记录器
  const logger = new Logger('Bootstrap');

  try {
    logger.log('正在启动应用程序...');

    let app;
    const port = 3000;

        // 检查SSL证书文件是否存在
    const keyPath = join(__dirname, '..', 'ssl', 'www.litetextile.com.key');
    const certPath = join(
      __dirname,
      '..',
      'ssl',
      'www.litetextile.com_public.crt',
    );

    if (fs.existsSync(keyPath) && fs.existsSync(certPath)) {
      logger.log('SSL 证书文件存在，启动 HTTPS 模式');

      const httpsOptions = {
        key: fs.readFileSync(keyPath),
        cert: fs.readFileSync(certPath),
      };

      app = await NestFactory.create(AppModule, {
        httpsOptions,
        logger: ['error', 'warn', 'log', 'debug', 'verbose'],
      });

      logger.log(`HTTPS 服务器运行在: https://localhost:${port}`);
    } else {
      logger.log('SSL 证书文件不存在，启动 HTTP 模式');
      logger.log(`期望的证书文件路径:`);
      logger.log(`- ${keyPath}`);
      logger.log(`- ${certPath}`);

      app = await NestFactory.create(AppModule, {
        logger: ['error', 'warn', 'log', 'debug', 'verbose'],
      });

      logger.log(`HTTP 服务器运行在: http://localhost:${port}`);
    }

    // 启用 CORS
    app.enableCors({
      origin: true, // 允许所有来源
      methods: 'GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS',
      credentials: true,
    });

    // 全局异常过滤器，用于捕获和记录所有错误
    app.useGlobalFilters(new AllExceptionsFilter());

    // 全局拦截器，用于记录请求和响应
    app.useGlobalInterceptors(new LoggingInterceptor());

    await app.listen(port, '0.0.0.0'); // 监听所有网络接口

    logger.log(`应用程序已成功启动在端口 ${port}`);
    logger.log(`服务器地址: http://localhost:${port}`);
    logger.log(`健康检查地址: http://localhost:${port}/health`);
    
  } catch (error) {
    logger.error('应用程序启动失败:', error);
    logger.error('错误堆栈:', error.stack);

    // 如果是文件读取错误，提供更详细的错误信息
    if (error.code === 'ENOENT') {
      logger.error('文件未找到，请检查 SSL 证书文件路径');
    }

    // 如果是端口占用错误
    if (error.code === 'EADDRINUSE') {
      logger.error('端口已被占用，请尝试使用其他端口或停止占用该端口的进程');
    }

    process.exit(1);
  }
}

// 全局未捕获异常处理器
process.on('uncaughtException', (error) => {
  console.error('未捕获的异常:', error);
  console.error('错误堆栈:', error.stack);
  process.exit(1);
});

// 全局未处理的 Promise 拒绝处理器
process.on('unhandledRejection', (reason, promise) => {
  console.error('未处理的 Promise 拒绝:', reason);
  console.error('Promise:', promise);
  process.exit(1);
});

bootstrap();
